'''
1、概念：
       PO模式：Page Object Model 是一种在自动化测试中常用的设计模式，它将每个页面的元素和操作封装成一个对象，使得测试脚本更加清晰、易于维护和复用。
       核心思想：是将页面的元素定位和业务操作分开，这样当页面元素发生变化时，只需要修改页面对象的代码，而不需要修改测试脚本本身。
       在实际应用中，PO模式可以结合数据驱动测试，将测试数据与PO类的方法结合起来，实现数据驱动的测试。这样可以进一步提高测试的灵活性和覆盖率。
                  是一种有效的自动化测试设计模式，它通过封装页面元素和操作来提高测试代码的质量和效率。
        ① 三层结构：
                  每个层面对应一个单独的类，通过调用完成
                  对象库层（Base Page）：封装页面的一些公共方法（如初始化、查找元素、点击、输入、获取文本、截图等）
                                       封装定位元素的方法（定位方法）
                  操作层（Page Object）：封装对元素的操作，每个页面封装成一个对象，每个对象包含该页面的所有元素和操作这些元素的方法。
                                       封装对元素的操作（操作方法）
                  业务层（Test Script）：调用页面对象的方法来执行业务流程，实现测试用例。
                                       将一个或多个操作组合起来完成一个业务功能（如，登录：需要输入账号、密码、点击登录三个操作）
                                       （业务逻辑）
        ② 好处：
              提高代码的可读性和可维护性。
              减少代码重复，提高复用性。
              分离测试逻辑和页面元素，使得维护成本降低。
        ③ 实施步骤：
                 确定要测试的界面元素。
                 为每个界面元素创建PO类。
                 在测试用例或脚本中使用PO类。
                 更新和维护PO类以适应页面变化。
2、方法封装：
          将一些有共性的或多次被使用的代码提取到一个方法中，供其他地方调用
          封装的好处：
                   避免代码冗余
                   容易维护
                   隐藏代码实现的细节
          目的：用最少的代码实现最多的功能
          封装步骤：
                 确认方法的存放位置：找位置
                 给方法取个合适的名字：起名字
                 放入要封装的代码内容：放代码
                 确认是否需要参数和返回值：确必要
                 调用封装好的方法使用：做调用
3、详细操作：
       ① 代码见 ./v3/utils_02_new.py ，使用时，将其中的注释部分全部去除，然后复制粘贴到根目录下，见 utils.py
       ② 案例：tpshop的登录（账号不存在、密码错误）
                    v4/index_page.py  +  v4/login_page.py  +  v4/tpshop_login5.py  +  utils.py
       ③ 封装步骤：
                11、对应页面创建 po 代码文件，命令规则：页面功能 index_page.py
                12、定义三个类：对象层-IndexPage、操作层-IndexHandle、业务层-IndexTask
                13、对象层：
                         init 方法获取浏览器对象
                         自定义方法：封装元素定位方法
                         封装元素定位方法需要添加返回值
                14、操作层：
                         init 方法获取对象层对象，根据类名写对象变量名
                         自定义方法：封装元素操作方法
                15、业务层：
                         init 方法获取操作层对象，根据类名写对象变量名
                         自定义方法：封装测试业务逻辑
                16、在测试用例文件中，实例化业务层对象，调用测试业务方法，执行测试

'''